struct Solution {}

fn main() {}

// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
    pub val: i32,
    pub left: Option<Rc<RefCell<TreeNode>>>,
    pub right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
    #[inline]
    pub fn new(val: i32) -> Self {
        TreeNode {
            val,
            left: None,
            right: None
        }
    }
}

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn max_depth(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
        let mut cur: i32 = 1;
        let mut max: i32 = 0;
        if root.is_some() {
            Self::do_preorder(root, cur, &mut max);
        }
        max
    }

    fn do_preorder(root: Option<Rc<RefCell<TreeNode>>>, cur: i32, max: &mut i32) {
        if root.is_none() {
            return;
        }

        let rc = root.unwrap();
        if cur > *max {
            *max = cur;
        }
        if rc.borrow().left.is_some() {
            Self::do_preorder(rc.borrow().left.clone(), cur + 1, max);
        }

        if rc.borrow().right.is_some() {
            Self::do_preorder(rc.borrow().right.clone(), cur + 1, max);
        }
    }
}